with My_String; use My_String;

package Matiere is

   subtype Type_Intitule is Type_String;
   Type Type_Etat is (Libre, Simulee, Attribuee);

   Type Type_Note_Valeur is Record
      Avant_Virgule : Integer range 0..20;
      Apres_Virgule : Integer range 0..99;
   end Record;

   Type Type_Note(Selon : Type_Etat := Libre) is Record
      case Selon is
         when Simulee | Attribuee =>
            Valeur : Type_Note_Valeur;
         when Libre =>
            null;
      end case;
   end Record;

   subType Type_Coefficient is Positive range 1..8;

   Type Type_Matiere is Record
      Intitule : Type_Intitule;
      Note : Type_Note;
      Coefficient : Type_Coefficient := 1;
   end record;

   subtype Type_Nombre_Matieres is Integer range 0..10;
   type Type_Tab_Matieres is array(Type_Nombre_Matieres) of Type_Matiere;
   Type Type_Matieres is Record
      Nombre : Type_Nombre_Matieres := 0;
      Tab : Type_Tab_Matieres;
   end Record;

   function Tester_Intitule(Matieres : Type_Matieres; Intitule : Type_String) return Boolean;
   function Index_Intitule(Matieres : Type_Matieres; Intitule : Type_String) return Integer;
   procedure Retirer_Matiere(Matieres : in out Type_Matieres; Intitule : Type_String);

   function Note_To_Float(Note : Type_Note) return Float;

   procedure Liberer(Mat : out Type_Matiere);
   procedure Simuler(Mat : out Type_Matiere);
   procedure Attribuer(Mat : out Type_Matiere);
   procedure Modifier(Mat : out Type_Matiere);

end Matiere;